package top.dashuizhuyu.study;

import org.apache.shiro.crypto.RandomNumberGenerator;
import org.apache.shiro.crypto.SecureRandomNumberGenerator;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.apache.shiro.util.ByteSource;
import top.dashuizhuyu.study.entity.User;

/**
 * <p>
 *
 * 下面为了让Shiro能够在项目中生效我们需要通过代码的方式提供配置信息。
 * Shiro的安全管理提供了两个层面的控制：
 * （1）用户认证：需要用户通过登陆证明你是你自己。
 * （2）权限控制：在证明了你是你自己的基础上系统为当前用户赋予权限。后者我们已经在数据库中完成了大部分配置。
 *
 * 用户认证的常规手段就是登陆认证，在目前的情况下我们认为只有用户自己知道登陆密码。
 * 不过Shiro为我们做的更多，
 * 它还提供了一套能够很方便我们使用的密码散列算法。
 * 因为普通的散列技巧可以很容易的通过暴力手段破解，
 * 我们可以在散列的过程中加入一定的算法复杂度（增加散列次数与Salt）从而解决这样的问题。
 *
 * @author dashuizhuyu@foxmail.com
 * @date 2020/1/22 11:04
 **/
public class PasswordHelper {
    private RandomNumberGenerator randomNumberGenerator = new SecureRandomNumberGenerator();

    /**
     * 基础散列算法
     */
    static final String ALGORITHM_NAME = "md5";

    /**
     * 自定义散列次数
     */
    static final int HASH_ITERATIONS = 2;

    public void encryptPassword(User user) {
        // 随机字符串作为salt因子，实际参与运算的salt我们还引入其它干扰因子
        user.setSalt(randomNumberGenerator.nextBytes().toHex());
        String newPassword = new SimpleHash(ALGORITHM_NAME, user.getPassword(),
                ByteSource.Util.bytes(user.getCredentialsSalt()), HASH_ITERATIONS).toHex();
        user.setPassword(newPassword);
    }
}
